package edu.vt.ece3574.ninjatag;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.widget.TextView;

public class GPS_Tab extends Activity {

	// -----On Create Method-----
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.gps_tab);
		// TextView tv = new TextView(this);
		// tv.setText(LocationService.);
		// setContentView(tv);
		
		// Bind Service
		doBindService();
	}

	// -----Service Binding-----
	/**
	 * Example of binding and unbinding to the local service. This demonstrates
	 * the implementation of a service which the client will bind to, receiving
	 * an object through which it can communicate with the service.</p>
	 * 
	 * <p>
	 * Note that this is implemented as an inner class only keep the sample all
	 * together; typically this code would appear in some separate class.
	 */

	private boolean mIsBound;

	private LocationService mBoundService;

	private ServiceConnection mConnection = new ServiceConnection() {
		public void onServiceConnected(ComponentName className, IBinder service) {
			// This is called when the connection with the service has been
			// established, giving us the service object we can use to
			// interact with the service. Because we have bound to a explicit
			// service that we know is running in our own process, we can
			// cast its IBinder to a concrete class and directly access it.
			mBoundService = ((LocationService.LocalBinder) service).getService();
			startPollingThread();
		}

		public void onServiceDisconnected(ComponentName className) {
			// This is called when the connection with the service has been
			// unexpectedly disconnected -- that is, its process crashed.
			// Because it is running in our same process, we should never
			// see this happen.
			mBoundService = null;
		}
	};

	void doBindService() {
		// Establish a connection with the service. We use an explicit
		// class name because we want a specific service implementation that
		// we know will be running in our own process (and thus won't be
		// supporting component replacement by other applications).
		bindService(new Intent(this, LocationService.class), mConnection,
				Context.BIND_AUTO_CREATE);
		mIsBound = true;
	}

	void doUnbindService() {
		if (mIsBound) {
			// Detach our existing connection.
			unbindService(mConnection);
			mIsBound = false;
		}
	}

	// Variables
	TextView SatPosLat_;
	TextView SatPosLon_;

	// -----Updating Values on Screen-----
	private Handler handler = new Handler();

	public void updateGUI(final int p, final int q) {
		Runnable r = new Runnable() {
			public void run() {
				SatPosLat_.setText(p);
				SatPosLon_.setText(q);
			}
		};
		handler.post(r);
	}

	// -----Data Update Thread-----
	public void startPollingThread() {
		Runnable r = new Runnable() {
			public void run() {
				while (true) {
					int v = mBoundService.getLat();
					int w = mBoundService.getLon();
					updateGUI(v,w);
					try{
						Thread.currentThread().sleep(2000);
					}
					catch (Exception e) {
						// TODO: handle exception
					}
				}
			}
		};
		Thread t = new Thread(r);
		t.start();
	}

}